package IOStream.ZipStream;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * ClassName:Dome003
 * Package:IOStream.ZipStream
 * Description:
 *
 * @Author:ZhangXin
 * @Create2023/3/4-1:08
 * @Version:v1.0
 */
public class Dome003 {
    /**
     * 压缩整个文件夹
     */
    public static void main(String[] args) throws IOException {
        //创建File对象表示要压缩的文件夹
        File src = new File("E:\\aaa");
        //创建File对象表示压缩包放在哪里(父级路径)
        File destParent = src.getParentFile();
        //创建File对象表示压缩包的路径
        File dest = new File(destParent, src.getName() + ".zip");
        //创建压缩流关联压缩流
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(dest));
        //获取src里面的每一个文件,变成ZipEntry对象,放入压缩包当中
        toZip(src, zos, src.getName());
        //释放资源
        zos.close();
    }

    /**
     * 作用：获取src里面的每一个文件,变成ZipEntry对象,放入压缩包当中
     * <p>
     * 参数一：数据源
     * 参数二：压缩流
     * 参数三：压缩包内部的路径
     */
    public static void toZip(File src, ZipOutputStream zos, String name) throws IOException {
        //进入src文件夹
        File[] files = src.listFiles();
        //遍历数据
        for (File file : files) {

            if (file.isFile()) {
                //判断-文件  变成ZipEntry对象,放入压缩包当中
                ZipEntry entry = new ZipEntry(name + "\\" + file.getName());
                zos.putNextEntry(entry);
                FileInputStream fis = new FileInputStream(file);
                int b;
                while ((b = fis.read()) != -1) {
                    zos.write(b);
                }
                fis.close();
                zos.closeEntry();

            } else {
                //判断-文件夹  递归
                toZip(file,zos,name+"\\"+file.getName());
            }

        }
    }
}
